import os
from dotenv import load_dotenv
from langchain_openai import ChatOpenAI
from langchain_core.prompts import ChatPromptTemplate

# --- 环境准备 (与上一课相同) ---
print("正在从 env.example 加载环境变量...")
load_dotenv(dotenv_path="env.example")

# 检查环境变量
api_key = os.getenv("OPENAI_API_KEY")
model_name = os.getenv("OPENAI_MODEL", "qwen-plus-latest") # 使用默认值以增加健壮性

if not api_key:
    print("错误：请先在 env.example 文件中设置你的 OPENAI_API_KEY。")
else:
    print("环境变量加载成功！")
    # --- 核心代码开始 ---

    # 1. 初始化聊天模型 (与上一课相同)
    chat = ChatOpenAI(model=model_name)
    print(f"聊天模型已初始化 (使用 {model_name})。")

    # 2. 创建一个聊天提示模板
    # 这次，我们不再直接创建消息列表，而是创建一个模板。
    # 我们用 `{input_text}` 作为占位符，表示这里将由用户的输入来填充。
    prompt_template = ChatPromptTemplate.from_messages(
        [
            ("system", "你是一个专业的翻译家，你的任务是只将用户的输入从中文翻译成英文，不要有任何额外的解释。"),
            ("human", "{input_text}"),
        ]
    )
    print("提示模板已创建。")

    # 你可以看看这个模板的样子
    # print("模板内容:", prompt_template)

    # 3. 将模板和模型组合成一个链 (Chain)
    # 这是 LangChain 中一个极其重要的概念：LCEL (LangChain Expression Language)
    # 我们使用管道符 `|` (pipe) 将不同的组件连接起来，形成一个处理流程。
    # 这行代码的意思是：用户的输入首先经过 prompt_template 进行格式化，然后将结果传给 chat 模型进行处理。
    chain = prompt_template | chat
    print("处理链已创建 (模板 | 模型)。")


    # 4. 调用链并获取结果
    # 调用链的方式和调用模型一样，使用 .invoke()
    # 但这次的输入不再是消息列表，而是一个字典，key 对应模板中的占位符。
    print("\n------ 第一次调用 ------")
    print("正在翻译: '你好，世界！'")
    response_1 = chain.invoke({"input_text": "你好，世界！"})

    # 结果同样是一个 AIMessage 对象
    print("AI 回复:", response_1.content)

    print("\n------ 第二次调用 ------")
    print("正在翻译: 'LangChain 是一个强大的框架。'")
    response_2 = chain.invoke({"input_text": "LangChain 是一个强大的框架。"})
    print("AI 回复:", response_2.content)
    print("--------------------") 